package com.example.kotlin.mvp

import com.example.kotlin.mvp.base.BaseView
import java.lang.ref.WeakReference
import java.lang.reflect.Proxy

class BasePresenterV1<V : BaseView?> {
    // 目前两个两个公用方法 ，传递的时候 会有不同的 View ，怎么办？泛型
    private var mViewReference: WeakReference<V?>? = null
    var view: V? = null
        private set

    // View 一般都是 Activity ,涉及到内存泄漏，但是已经解绑了不会，如果没解绑就会泄漏
    // 最好还是用一下软引用
    // View 有一个特点，都是接口
    // GC 回收的算法机制（哪几种）标记清楚法
    fun attach(view: V) {
        mViewReference = WeakReference(view)

        // 用代理对象
        this.view = Proxy.newProxyInstance(
            view!!::class.java.getClassLoader(),
            view!!::class.java.getInterfaces()
        ) { proxy, method, args ->
            // 执行这个方法 ，调用的是被代理的对象
            if (mViewReference == null || mViewReference?.get() == null) {
                null
            } else method.invoke(mViewReference?.get(), *args)
            // 没解绑执行的是原始被代理 View 的方法
        } as V
    }

    fun detach() {
        // 不解绑的问题 Activity -> Presenter  ,Presenter 持有了 Activity 应该是会有内存泄漏
        mViewReference!!.clear()
        mViewReference = null
        // 注释
        // this.mProxyView = null;
    }
}